﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmElencoTessere : Form
    {
        private DataTable tableTessere = new DataTable();
        private static frmElencoTessere session;
        private ctrlTessera ctrlTessera = new ctrlTessera();
        private Utente Utente;

        #region costruttore ed istanza

        public static frmElencoTessere Istance(Utente utente)
        {
            if (session == null)
                session = new frmElencoTessere(utente);
            return session;
        }

        private frmElencoTessere(Utente utente)
        {
            InitializeComponent();
            this.Utente = utente;
            SettaTable();
            AggiornaGrid(null);
            PermessiUtente(utente);
        }

        #endregion costruttore ed istanza

        #region DataGrid, DataTable e ricerca

        private void SettaTable()
        {
            tableTessere.Columns.Add("id", typeof(Guid));
            tableTessere.Columns.Add("Codice", typeof(string));
            tableTessere.Columns.Add("Abilitata", typeof(string));
            tableTessere.Columns.Add("Associata a", typeof(string));
        }

        private void AggiornaGrid(Tessera tessera)
        {
            List<Tessera> tessere = ctrlTessera.SelectAll();
            tableTessere.Rows.Clear();
            foreach (Tessera t in tessere)
            {
                Persona persona = ctrlTessera.GetPersonaByTessera(t.Id);
                tableTessere.Rows.Add(
                    t.Id,
                    t.Codice,
                    t.Abilitata ? "Abilitata" : "Non Abilitata",
                    persona == null ? "nessuno" : persona.Cognome + " " + persona.Nome
                    );
            }
            tessereDataGrid.DataSource = tableTessere;
            tessereDataGrid.Columns["id"].Visible = false;

            if (tessera != null)
            {
                tessereDataGrid.ClearSelection();
                SelezionaRiga(tessereDataGrid, tessera.Id);
            }
        }

        private void SelezionaRiga(DataGridView data, Guid id)
        {// controlla riga per riga finchè non trova l'elemento con lo stesso id della tessera appena inserita
            for (int i = 0; i < data.Rows.Count; i++)
            {
                if (data["id", i].Value.ToString() == id.ToString())
                {
                    data.Rows[i].Selected = true;
                    return;
                }
            }
        }

        public void AggiornaGridDaEsterni(Tessera tessera)
        {
            AggiornaGrid(tessera);
        }

        #endregion DataGrid, DataTable e ricerca

        #region Eventi

        private void btnNuovo_Click(object sender, EventArgs e)
        {
            frmAggiungiTessera frm = new frmAggiungiTessera(StatoForm.Nuovo, null, this);
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }

        private void btnModifica_Click(object sender, EventArgs e)
        {
            if (tessereDataGrid.SelectedRows.Count > 0)
            {
                if (tessereDataGrid.SelectedRows[0].Cells["id"] != null)
                {
                    frmAggiungiTessera modifica = new frmAggiungiTessera(
                        StatoForm.Modifica,
                        ctrlTessera.GetTesseraById((Guid)tessereDataGrid.SelectedRows[0].Cells["id"].Value),
                        this
                        );
                    modifica.MdiParent = this.MdiParent;
                    modifica.Show();
                }
            }
        }

        private void btnElimina_Click(object sender, EventArgs e)
        {
            if (tessereDataGrid.SelectedRows.Count > 0)
            {
                DialogResult scelta = MessageBox.Show("Sicuro di voler eliminare le righe selezionate ?", "Attenzione!",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (scelta == System.Windows.Forms.DialogResult.Yes)
                {
                    for (int i = 0; i < tessereDataGrid.SelectedRows.Count; i++)
                    {
                        if (tessereDataGrid.SelectedRows[i].Cells["id"] != null)
                        {
                            try
                            {
                                ctrlTessera.DeleteTesseraById((Guid)tessereDataGrid.SelectedRows[i].Cells["id"].Value);

                                Tessera Tessera = new Tessera();
                                Tessera.Id = (Guid)tessereDataGrid.SelectedRows[i].Cells["id"].Value;
                                Tessera.Codice = tessereDataGrid.SelectedRows[i].Cells["Codice"].Value.ToString();
                                new ctrlMovimentiTessere().RegistraMovimento(Tessera, "Cancellata");
                            }
                            catch (TesseraAssociataAPersona ex)
                            {
                                MessageBox.Show(ex.Message, "Attenzione", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                return;
                            }
                        }
                    }
                    AggiornaGrid(null);
                }
            }
        }

        private void frmElencoTessere_FormClosing(object sender, FormClosingEventArgs e)
        {
            session = null;
        }

        #endregion Eventi

        #region Metodi Vari

        private void PermessiUtente(Utente utente)
        {
            ctrlUtente ctrlUtente = new ctrlUtente();
            if (ctrlUtente.isSuperAdmin(utente) || ctrlUtente.PuoScrivere(utente))
            {
                btnElimina.Enabled = true;
                btnModifica.Enabled = true;
                btnNuovo.Enabled = true;
            }
            else
            {
                btnElimina.Enabled = false;
                btnModifica.Enabled = false;
                btnNuovo.Enabled = false;
            }
        }

        #endregion Metodi Vari

        private void txtRicerca_TextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtRicerca.Text))
            {
                tableTessere.DefaultView.RowFilter = "";
            }
            else
            {
                string testo = txtRicerca.Text.Replace("'", "''");
                string temp = "[Codice] LIKE '%" + testo
                        + "%' or [Abilitata] LIKE '%" + testo + "%'"
                        + " or [Associata a] LIKE '%" + testo + "%'";

                tableTessere.DefaultView.RowFilter = temp;
            }
        }

        private void tessereDataGrid_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right &&
                tessereDataGrid.Rows.Count > 0)
            {
                Point pt = tessereDataGrid.PointToScreen(e.Location);
                menudx.Show(pt);
            }
        }

        private void abilitaDisabilitaTesseraToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Tessera Tessera = new Tessera();
            Tessera.Codice = (string)tessereDataGrid.SelectedRows[0].Cells["codice"].Value;
            frmAbDisabTessera frm = new frmAbDisabTessera(this.Utente, Tessera);
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }
    }
}